在 Hello World 的教學範例中我們學會了如何把一些「東西」顯示出來,那今天就讓我們一起來認識一下這些「東西」吧~
我們都知道電腦裡的一切都是由 0 跟 1 所組成的,而電腦的系統則會把這些數字的組合轉變為「資料 (Data)」來進行辨識。資料的類別主要分為兩種:一種是讓電腦執行的指令,也就是程式;而另一種則是在電腦執行指令時會需要儲存或讀取的數值,也是我們今天的討論的「東西」。
這些可以被程式所讀取的數值資料會隨著不同的程式語言被細分為很多的種類,這些不同的種類會被我們統稱為「資料型態」。由於資料型態的名稱及種類會因為不同的程式語言而有所差異並出現不同的變體,因此這裡便不把包含不同變體的所有資料型態一一細看了。這次我們會集中討論的是主要的資料型態。
1. 整數類
整數類資料型態是指代表了數學中的整數值的資料。不過,整數類資料型態所能包含的範圍跟數學中的整數值不同,並不能包含從負無限到正無限這麼廣的範圍,而是因應程式本身的限制而有所變化。由於使用資料時會同時佔用到電腦的暫存記憶體 (RAM),因此在早期的電腦程式中,會預估使用的資料可能的數值範圍並跟據這個範圍來設定資料可包含的數值的上下限,以此來減少它所需要佔用的記憶體,讓當時非常有限的電腦資源可以分配到更多的地方來讓程式可以做到更多的事。後來,整數類資料型態便使用這些不同的數值的上下限中比較通用的幾個種類來發展出了不同的變體,例如在 C 語言中便把整數類資料型態劃分為短整數 (short [short integer])、整數 (int [integer])、長整數 (long [long integer]) 跟後來在電腦的資源變得更多後所追加的 長長整數 (long long [long long integer])。
整數類資料型態的變體及其上下限的範圍在不同的程式語言都有所不同。值得注意的是,即使不同的程式語言為該資料型態使用了相同的名稱,他們所能包含的範圍也不一定會一樣,例如 C 語言中的 int 資料型態的上限是2147483647,而 Python 中的 int 資料型態的上限則是 9223372036854775807。因此,在使用正在學習的程式語言的整數類資料型態前,可以先查詢一下該語言有什麼種類的整數類資料型態跟它們分別的上下限是多少。
不過,由於現在的電腦資源比較充足,在大多數的情況下我們已經不再需要為了節省電腦記憶體而預估使用的資料可能的數值範圍來挑選使用的資料型態種類,直接使用最常見的 int 或 integer 資料型態已經能包含非常廣的數值範圍,只有在可能遇到極端的狀況下才會改用其他種類。
2. 浮點數類
浮點數類資料型態是指代表了數學中的包含了小數值的資料,它是為了應對整數類資料型態無法表達帶有小數的數值而被發明的。浮點數類資料型態除了需要面對上文所提到的早期電腦資源不足問題外,它還遇到另一個問題:小數是可以無窮無盡的,例如無理數中的其中一個著名的例子 圓周率 π。因此,浮點數類資料型態便很難只透過限制數值的上下限來限制它可能使用的記憶體量。為了解決這個問題,使用浮點數運算的浮點數表示法 (有興趣的話可在下面延伸閱讀中了解更多的詳情) 便被設計並使用來代表帶有小數的數值。可是,這個表示法的缺點是它只能表示一個大概的、不精確的數值,實際運行程式時是有可能在計算中導致數值跟原來相比出現非常細微的差異。在大多數的狀況下,這些差異是可以被忽略的,但在需要非常精確的計算結果的情況下,如金融交易中計算金錢的部分,我們便不應該使用浮點數類資料型態,而是分開計算整數跟小數的部分了。
一般的程式語言通常會有代表使用較少記憶體但可包含的數值範圍較小的單精度浮點數 float 資料型態跟可包含的數值範圍較大但使用較多記憶體的雙精度浮點數 double 資料型態。不過,有些程式會針對浮點數類資料型態進行一下調整或改變,如 Python 中便只提供 float 資料型態,但它卻是屬於雙精度浮點數、而 C 語言則是增加了可以包含比雙精度浮點數更大的數值範圍的 long double 資料型態等。
另外,針對上面提到的浮點數計算中有著不精確的問題,C# 便提供了一個能有更精確的計算結果的 decimal 資料型態,這讓使用者需要精確計算時,可以直接使用它而不需要再進行分開計算,只是 decimal 資料型態有著使用比雙精度浮點數更多記憶體卻只能包含比單精度浮點數更小的數值範圍。因此,在不需要精確計算的狀況下,工程師一般還是會較傾向於使用 float 資料型態或 double 資料型態。
延伸閱讀:
維基百科 - 浮點數:https://zh.wikipedia.org/wiki/%E6%B5%AE%E7%82%B9%E6%95%B0
維基百科 - 單精度浮點數:https://zh.wikipedia.org/wiki/%E5%96%AE%E7%B2%BE%E5%BA%A6%E6%B5%AE%E9%BB%9E%E6%95%B8
維基百科 - 雙精度浮點數:https://zh.wikipedia.org/wiki/%E9%9B%99%E7%B2%BE%E5%BA%A6%E6%B5%AE%E9%BB%9E%E6%95%B8
3. 文字類
文字類資料型態是一般包含了所有非數字的資料。一般來說,文字類資料型態是儲存著把非數字的資料透過編碼系統以數字表示的編碼,在我們存取的時候才會把編碼重新轉換為非數字的資料,舉例來說:當我們要儲存一個「A」字到程式中,程式會使用 ASCII 編碼系統把「A」轉變為「65」並儲存起來,再在我們需要重新從程式中讀取「A」字時把儲存的「65」轉變為「A」輸出給我們。
在程式語言中,文字類資料型態一般被分為字元資料型態,char,跟字串資料型態,string。
字元資料型態是把每一個文字都當成一個獨立的資料來進行儲存,例如我們想要儲存「你好,程式」為字元資料型態,程式便會把每一個中文字跟標點符號拆開來,變成 5 個獨立的字元資料型態來進行儲存。
字串資料型態則是把一組文字當成一個獨立的資料來進行儲存,例如我們同樣想要儲存「你好,程式」為字串資料型態,程式便會把一整句都儲存在同一個字串資料型態中。需要注意的是,由於字串資料型態可以說是字元資料型態的進階變體,因此有些程式語言,如 C 語言,並沒有提供字串資料型態。不過,由於字串資料型態跟字元資料型態之間的關係包含著其他的程式概念,因此我們會在以後的章節中再針對字串資料型態進行更多的討論。
延伸閱讀:
維基百科 - ASCII:https://zh.wikipedia.org/wiki/ASCII
4. 布林值
布林值資料型態是一種非常特殊的資料型態,它是在程式用來進行邏輯相關的指令,如以後會進行討論的條件式,時所使用的資料型態,它所代表的資料只有真/是 (True) 與假/否 (False) 兩種。在早期還沒有存在布林值資料型態時,工程師們都使用 1 跟 0 兩個數值來分別代表著這兩個邏輯資料,這也是為什麼我們有時候在生活中會看到一些電源開關會在兩邊標示著 1 跟 0 來表示開啟與關閉的功能。